// 文件：src/workers/hash.worker.js
// 注意：使用 Vite 的 Web Worker 支持（推荐 vite-plugin-web-worker 或 Vite 原生 worker 导入）
// 传统 importScripts 方式不推荐，因为现代构建工具能更好地处理模块依赖

// 导入 SparkMD5 库（推荐通过 npm 安装本地依赖）
import SparkMD5 from "spark-md5";

// 监听主线程消息（当主线程通过 worker.postMessage 发送数据时触发）
self.onmessage = async function (e) {
  // 从消息事件中获取文件对象
  const file = e.data.file;

  // 设置分块大小为 2MB
  const chunkSize = 2 * 1024 * 1024;

  // 计算总分块数量
  const chunks = Math.ceil(file.size / chunkSize);

  // 当前处理的分块索引
  let currentChunk = 0;

  // 初始化 MD5 计算器
  const spark = new SparkMD5.ArrayBuffer();

  // 循环处理所有文件分块
  while (currentChunk < chunks) {
    // 计算当前分块的起始位置
    const start = currentChunk * chunkSize;

    // 计算当前分块的结束位置（确保不超过文件大小）
    const end = Math.min(start + chunkSize, file.size);

    // 截取文件分块（Blob 对象）
    const chunk = file.slice(start, end);

    // 将 Blob 转换为 ArrayBuffer（异步操作）
    const buffer = await chunk.arrayBuffer();

    // 将当前分块数据添加到哈希计算
    spark.append(buffer);

    // 移动到下一个分块
    currentChunk++;

    // 向主线程发送进度更新（计算当前完成百分比）
    self.postMessage({
      progress: Math.round((currentChunk / chunks) * 100),
    });
  }

  // 计算最终哈希值（十六进制字符串）
  const hash = spark.end();

  // 向主线程发送最终结果
  self.postMessage({
    hash, // 完整的文件哈希值
    done: true, // 完成标志
  });

  // 关闭 Worker 释放资源（避免内存泄漏）
  self.close();
};
